package com.duan.design.strategy.head.duck;

import com.duan.design.strategy.head.behavior.fly.FlyBehavior;
import com.duan.design.strategy.head.behavior.quack.QuackBehavior;

/**
 * 鸭子超类
 * @author duanjw
 */
public abstract class Duck {

    /**利用组合的方式，封装飞行的行为和叫的行为。建议多用组合，少用继承**/
    /**
     * 飞行的行为
     */
    public FlyBehavior flyBehavior;
    /**
     * 叫的行为
     */
    public QuackBehavior quackBehavior;

    /**
     * 设置飞的行为
     * @param flyBehavior
     */
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    /**
     * 设置叫的行为
     * @param quackBehavior
     */
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }


    /**
     * 飞
     * 委托给子类
     */
    public void performFly(){
        flyBehavior.fly();
    }

    /**
     * 叫
     * 委托给子类
     */
    public void performQuack(){
        quackBehavior.quack();
    }

    /**
     * 游泳
     */
    public void swim() {
        System.out.println("我在游泳");
    }

    /**
     * 展现，每个鸭子外观不同，展示也不同，有实现类自己实现
     */
    public abstract void display();
}
